package com.sxz.mall.mallsearch.thread;

import java.util.concurrent.*;

/**
 * completableFuture, 传入Runnable和executor，相当于使用线程池执行任务
 */
public class CompletableDemo02 {
    // 自定义执行器
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,
            100,
            10,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(100),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println("线程开始了11.....");
            int i = 100 / 0;
            System.out.println("线程结束了11.....");
            return i;
        }, executor).whenCompleteAsync((res, exce) -> {// 可以获取异步返回值和异常，不能修改结果
            System.out.println("res:..=" + res);
            System.out.println("exce:" + exce);
        }).exceptionally((res) -> {  // 出异常了会走这里，修改结果
            System.out.println("res:" + res);

            return 10;
        });

        // .handle也可以接收结果res和异常exce  并且可以修改
        // .thenRun  串行执行lambda表达式新任务，不接收前面的返回值
        // .thenAccept  接收前面的结果，不返回
        // .thenApply  可以接收和返回新结果                             上面的如果是异步方法+Async，就可以再添加一个参数 executor

        System.out.println("获取到的执行结果:" + integerCompletableFuture.get());

    }
}
